import { createUniFetch } from 'uni-app-fetch'
import { getCurrentPageRoute, getTabBarPagePathList, toast } from '@/utils/utils.js'
import { useUserStore } from '@/stores/user.js'

const baseURL = 'https://slwl-api.itheima.net'
const baseURL_mock = 'https://mock.apifox.cn/m1/3114011-0-default'

// import { uniFetch } from '/apis/uni-fetch.js'
export const uniFetch = createUniFetch({
  loading: { title: '正在加载...' },
  baseURL,
  intercept: {
    request(config) {
      // 使用mock服务
      if (config.mock) {
        config.url = config.url.replace(baseURL, baseURL_mock)
      }

      // TODO: 请求拦截器后续的逻辑
      const { token } = useUserStore()

      if (token) {
        // 这种有缺点：会无脑的覆盖用户指定的配置
        // config.header.Authorization = `Bearer ${token}`

        // 从右往左替换重复的key，如果用户指定了，那以用户的为准
        config.header = Object.assign({}, { Authorization: token }, config.header)
      }

      return config
    },
    response(res) {
      // TODO: 响应拦截器后续的逻辑

      const { data, statusCode } = res

      if (statusCode === 401) {
        // 登录过期

        const returnURL = getCurrentPageRoute()

        const tabBarPagePathList = getTabBarPagePathList()

        const returnType = tabBarPagePathList.includes(returnURL.slice(1)) ? 'switchTab' : 'redirectTo'
        // 1. 登录成功后，要跳转，跳转的路径要是上一个页面，
        // 2. 所以在跳到登录去的时候把当前页面地址带上，登录成功后，才知道要往哪里跳
        // 3. 这个回跳地址，有可能是tabBar页面，所以要判断是否是tabBar页面
        // 4. 如何判断是不是tabBar页面呢？就是看在不在pages.json的tabBar配置项中
        // 5. 所以，我们就导入了pages.json中所有的配置内容，就能拿到tabBar配置项
        // 6. 就可以提取tabBar配置项中的所有页面路径
        // 7. 就可以判断当前页面路径在不在这些tabBar页面路径中啊
        // 8. 如果在，那就用switchTab跳啊，不在，就用redirectTo跳啊
        // 9. 所以，我先在跳到登录页面去的时候，就告诉登录页面，你到时候应该用什么类型来跳

        uni.redirectTo({
          url: `/pages/login/index?returnType=${returnType}&returnURL=${returnURL}`,
        })

        return new Promise(() => {})
      }

      if (data.code !== 200) {
        toast(data.msg)
        return Promise.reject(res)
      }

      return data
    },
  },
})

uni.fetch = uniFetch
